#
# Created: 2025-08-01

'''
友友们注意哦，proplot只适用Python 3.9及以下哦，如果要用这个包，可以使用conda创建一个3.9的环境
'''

import pandas as pd
import proplot as pplt
import matplotlib.pyplot as plt

# 设置全局字体，统一使用 Times New Roman，更适合学术论文
plt.rcParams['font.family'] = 'Times New Roman'

# 读取数据文件（假设当前目录中已有 'hist_data.csv' 文件）
df = pd.read_csv('hist_data.csv')  # 读取 CSV 文件
x = df['x'].values  # 获取 x 列数据（作为横轴）
y = df['y'].values  # 获取 y 列数据（作为纵轴）

# 设置直方图的分箱区间（范围从 -3 到 3，步长为 0.25）
bins = pplt.arange(-3, 3, 0.25)

# 创建图像画布，包含 2 列子图（ncols=2），每列宽度为默认宽度的 2.3 倍
fig, axs = pplt.subplots(ncols=2, refwidth=2.3)

# 设置整个图像的格式，包括标题、子图标签等
axs.format(
    abc='A.',              # 子图标签格式为 A. B.
    abcloc='l',            # 子图标签位置在左上角
    titleabove=True,       # 子图标题显示在图上方
    ylabel='y axis',       # 所有子图统一的 y 轴标签
    suptitle='Histograms with marginal distributions'  # 整体图像的标题
)

# 设置两组颜色与标题
colors = ['cornflowerblue', 'lightcoral']  # 蓝色和红色，用于区分左右两图
titles = ('Group 1', 'Group 2')  # 子图标题

# 遍历两个子图，分别绘制内容
for ax, which, color, title in zip(axs, 'lr', colors, titles):
    # ======= 主图：绘制二维直方图 =======
    ax.hist2d(
        x, y,                # 使用同一组 x、y 数据
        bins,               # 分箱设置
        vmin=0, vmax=10,    # 设置色阶值的范围，限制最大值为10
        levels=50,          # 色阶数量，值越多颜色越平滑
        cmap=color,         # 设置颜色映射
        colorbar='b',       # 在下方显示颜色条（b = bottom）
        colorbar_kw={'label': 'count'}  # 设置颜色条的标签
    )

    # ======= 边际图：调整颜色亮度 =======
    color = pplt.scale_luminance(color, 1.5)  # 提亮颜色，使边际图更清晰

    # ======= 左右面板：绘制 y 方向边际直方图 =======
    px = ax.panel(which, space=0)  # 在指定方向添加 panel（'l' 或 'r'）
    px.histh(
        y, bins,             # 使用 y 值绘制横向直方图
        color=color,         # 使用亮色
        fill=True,           # 填充柱状图
        ec='k'               # 边框颜色设为黑色
    )
    px.format(
        grid=False,          # 不显示网格
        xlocator=[],         # 不显示 x 轴刻度
        xreverse=(which == 'l')  # 如果在左侧，则反转 x 轴方向
    )

    # ======= 顶部面板：绘制 x 方向边际直方图 =======
    px = ax.panel('t', space=0)  # 添加顶部 panel
    px.hist(
        x, bins,             # 使用 x 值绘制纵向直方图
        color=color,         # 使用亮色
        fill=True,           # 填充柱状图
        ec='k'               # 边框颜色设为黑色
    )
    px.format(
        grid=False,          # 不显示网格
        ylocator=[],         # 不显示 y 轴刻度
        title=title,         # 设置标题，如 Group 1 或 Group 2
        titleloc='l'         # 标题左对齐
    )

# ======= 保存并展示图像 =======
fig.savefig('hist_with_marginals.png', dpi=300)  # 保存为 PNG 文件，分辨率 300dpi
pplt.show()  # 显示图像窗口
